{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "10d2a060",
   "metadata": {},
   "source": [
    "# Custom Problem Configuration"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "63187b25",
   "metadata": {},
   "source": [
    "This notebook shows how to use the Job Shop Scheduling Environment to solve a custom defined JSP problem variant. It build upon a json based format for formulating a problem at hand, and uses the included parser to configure the JobShopEnv based on the provided data. One can then provide the envoronment to one of the included solution methods to solve the problem at hand. \n",
    "\n",
    "One can choose to formulate the following:\n",
    "\n",
    "- Job shop or a Flow Shop problem\n",
    "- Flexible Machine allocation (an operation can be processed on one or more machines)\n",
    "- Assembly scheduling (an operation depends on multiple predecessors from different jobs to be complete to be started)\n",
    "- Sequence dependent setup times (different setup times between different operations on the different machines)\n",
    "\n",
    "Lets start with loading in the required imports:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "e3f929f7",
   "metadata": {},
   "outputs": [],
   "source": [
    "from data_parsers.custom_instance_parser import parse\n",
    "from plotting.drawer import plot_gantt_chart, draw_precedence_relations\n",
    "\n",
    "from solution_methods.GA.src.initialization import initialize_run\n",
    "from solution_methods.GA.run_GA import run_GA\n",
    "from solution_methods.CP_SAT.run_cp_sat import run_CP_SAT"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "92120c48",
   "metadata": {},
   "source": [
    "### Defining Custom Instance"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d9c15cce",
   "metadata": {},
   "source": [
    "We will solve a custom-defined problem instance, which we formulate in a JSON-based structure. For this, we define the nr of machines, the jobs (with their operations, processing times of operations on individual machines, and predecessor operation(s)), and the sequence-dependent setup times (configured between individual operations on the provided machines). \n",
    "\n",
    "Note: We recommend providing a new job_id to an operation that has multiple preceding operations."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "87148bee-4918-4b3c-a30a-c7ac6e4bd191",
   "metadata": {},
   "outputs": [],
   "source": [
    "processing_info = {\n",
    "        \"instance_name\": \"custom_problem_instance\",\n",
    "        \"nr_machines\": 2, \n",
    "        \"jobs\": [\n",
    "            {\"job_id\": 0, \"operations\": [\n",
    "                {\"operation_id\": 0, \"processing_times\": {\"machine_1\": 10, \"machine_2\": 20}, \"predecessors\": None},\n",
    "                {\"operation_id\": 1, \"processing_times\": {\"machine_1\": 25, \"machine_2\": 19}, \"predecessors\": [0]}\n",
    "            ]},\n",
    "            {\"job_id\": 1, \"operations\": [\n",
    "                {\"operation_id\": 2, \"processing_times\": {\"machine_1\": 23, \"machine_2\": 21}, \"predecessors\": None},\n",
    "                {\"operation_id\": 3, \"processing_times\": {\"machine_1\": 12, \"machine_2\": 24}, \"predecessors\": [2]}\n",
    "            ]},\n",
    "            {\"job_id\": 2, \"operations\": [\n",
    "                {\"operation_id\": 4, \"processing_times\": {\"machine_1\": 37, \"machine_2\": 21}, \"predecessors\": None},\n",
    "                {\"operation_id\": 5, \"processing_times\": {\"machine_1\": 23, \"machine_2\": 34}, \"predecessors\": [4]}\n",
    "            ]}\n",
    "        ],\n",
    "        \"sequence_dependent_setup_times\": {\n",
    "            \"machine_1\": [\n",
    "                [0, 25, 30, 35, 40, 45],\n",
    "                [25, 0, 20, 30, 40, 50],\n",
    "                [30, 20, 0, 10, 15, 25],\n",
    "                [35, 30, 10, 0, 5, 10],\n",
    "                [40, 40, 15, 5, 0, 20],\n",
    "                [45, 50, 25, 10, 20, 0]\n",
    "            ],\n",
    "            \"machine_2\": [\n",
    "                [0, 21, 30, 35, 40, 45],\n",
    "                [21, 0, 10, 25, 30, 40],\n",
    "                [30, 10, 0, 5, 15, 25],\n",
    "                [35, 25, 5, 0, 10, 20],\n",
    "                [40, 30, 15, 10, 0, 25],\n",
    "                [45, 40, 25, 20, 25, 0]\n",
    "            ]\n",
    "        }\n",
    "    }"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7d3129d8-93eb-48a6-97d5-475f9fa87d65",
   "metadata": {},
   "source": [
    "### Intrepretting configured Instances"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "57984bb1-a5b9-4af0-bd48-3959ad491492",
   "metadata": {},
   "source": [
    "By plotting the different jobs, operations and their precedence constratints, we can inspect wether the configred job:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "48f2fe00-4eb7-44f4-a25d-5e5b1cc8703e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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CHYAAAAAUBDBDgAAAAAKItgBAAAAQEEEOwAAAAAoiGAHAAAAAAUR7AAAAACgIIIdAAAAABREsAMAAACAggh2AAAAAFAQwQ4AAAAACiLYAQAAAEBBBDsAAAAAKIhgBwAAAAAFEewAAAAAoCCCHQAAAAAURLADAAAAgIIIdgAAAABQEMEOAAAAAAoi2AEAAABAQQQ7AAAAACiIYAcAAAAABRHsAAAAAKAggh0AAAAAFESwAwAAAICCCHYAAAAAUBDBDgAAAAAKItgBAAAAQEEEOwAAAAAoiGAHAAAAAAUR7AAAAACgIIIdAAAAABREsAMAAACAggh2AAAAAFAQwQ4AAAAACiLYAQAAAEBBBDsAAAAAKIhgBwAAAAAFEewAAAAAoCCCHQAAAAAURLADAAAAgIIIdgAAAABQEMEOAAAAAAoi2AEAAABAQQQ7AAAAACiIYAcAAAAABRHsAAAAAKAggh0AAAAAFESwAwAAAICCCHYAAAAAUBDBDgAAAAAKItgBAAAAQEEEOwAAAAAoiGAHAAAAAAUR7AAAAACgIIIdAAAAABREsAMAAACAggh2AAAAAFAQwQ4AAAAACiLYAQAAAEBBBDsAAAAAKIhgBwAAAAAFEewAAAAAoCCCHQAAAAAURLADAAAAgIIIdgAAAABQEMEOAAAAAAoi2AEAAABAQQQ7AAAAACiIYAcAAAAABRHsAAAAAKAggh0AAAAAFESwAwAAAICCCHYAAAAAUBDBDgAAAAAKItgBAAAAQEEEOwAAAAAoiGAHAAAAAAUR7AAAAACgIIIdAAAAABREsAMAAACAggh2AAAAAFAQwQ4AAAAACiLYAQAAAEBBBDsAAAAAKIhgBwAAAAAFEewAAAAAoCCCHQAAAAAURLADAAAAgIIIdgAAAABQEMEOAAAAAAoi2AEAAABAQQQ7AAAAACiIYAcAAAAABRHsAAAAAKAggh0AAAAAFESwAwAAAICCCHYAAAAAUBDBDgAAAAAKItgBAAAAQEEEOwAAAAAoiGAHAAAAAAUR7AAAAACgIIIdAAAAABREsAMAAACAggh2AAAAAFAQwQ4AAAAACiLYAQAAAEBBBDsAAAAAKIhgBwAAAAAFEewAAAAAoCCCHQAAAAAURLADAAAAgIIIdgAAAABQEMEOAAAAAAoi2AEAAABAQQQ7AAAAACiIYAcAAAAABRHsAAAAAKAg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ABREsAMAAACAggh2AAAAAFAQwQ4AAAAACiLYAQAAAEBBBDsAAAAAKIhgBwAAAAAFEewAAAAAoCCCHQAAAAAURLADAAAAgIIIdgAAAABQEMEOAAAAAAoi2AEAAABAQQQ7AAAAACiIYAcAAAAABRHsAAAAAKAggh0AAAAAFESwAwAAAICCCHYAAAAAUBDBDgAAAAAKItgBAAAAQEEEOwAAAAAoiGAHAAAAAAUR7AAAAACgIIIdAAAAABREsAMAAACAggh2AAAAAFAQwQ4AAAAACiLYAQAAAEBBBDsAAAAAKIhgBwAAAAAFEewAAAAAoCCCHQAAAAAURLADAAAAgIIIdgAAAABQEMEOAAAAAAoi2AEAAABAQQQ7AAAAACiIYAcAAAAABRHsAAAAAKAggh0AAAAAFESwAwAAAICCCHYAAAAAUBDBDgAAAAAKItgBAAAAQEEEOwAAAAAoiGAHAAAAAAUR7AAAAACgIIIdAAAAABREsAMAAACAggh2AAAAAFAQwQ4AAAAACiLYAQAAAEBBBDsAAAAAKIhgBwAAAAAFEewAAAAAoCCCHQAAAAAURLADAAAAgIIIdgAAAABQEMEOAAAAAAoi2AEAAABAQQQ7AAAAACiIYAcAAAAABRHsAAAAAKAggh0AAAAAFESwAwAAAICCCHYAAAAAUBDBDgAAAAAKItgBAAAAQEEEOwAAAAAoiGAHAAAAAAUR7AAAAACgIIIdAAAAABREsAMAAACAggh2AAAAAFAQwQ4AAAAACiLYAQAAAEBBBDsAAAAAKIhgBwAAAAAFEewAAAAAoCCCHQAAAAAURLADAAAAgIIIdgAAAABQEMEOAAAAAAoi2AEAAABAQQQ7AAAAACiIYAcAAAAABRHsAAAAAKAggh0AAAAAFESwAwAAAICCCHYAAAAAUBDBDgAAAAAKItgBAAAAQEEEOwAAAAAoiGAHAAAAAAUR7AAAAACgIIIdAAAAABREsAMAAACAggh2AAAAAFAQwQ4AAAAACiLYAQAAAEBBBDsAAAAAKIhgBwAAAAAFEewAAAAAoCCCHQAAAAAURLADAAAAgIIIdgAAAABQEMEOAAAAAAoi2AEAAABAQQQ7AAAAACiIYAcAAAAABRHsAAAAAKAggh0AAAAAFESwAwAAAICCCHYAAAAAUBDBDgAAAAAKItgBAAAAQEEEOwAAAAAoiGAHAAAA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",
      "text/plain": [
       "<Figure size 1600x800 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "jobShopEnv = parse(processing_info)\n",
    "draw_precedence_relations(jobShopEnv)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fc0f1261",
   "metadata": {},
   "source": [
    "### CP-SAT solver"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b072dfaf-a8a6-4b8d-bf34-9d866fcf50dc",
   "metadata": {},
   "source": [
    "In the code below we configure the OR-TOOLS CP-SAT solver to solve the defined problem. For this, we decide one the time limit for the solver (in seconds) and what model to use (current implementations allows for: jsp, fsp, fjsp and fjsp_sdst)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "cbfcc7c7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Solution 0, time = 0.012427 s, objective = 119\n",
      "Solution 1, time = 0.014747 s, objective = 102\n",
      "Solution 2, time = 0.016802 s, objective = 100\n",
      "Solution:\n",
      "Optimal Schedule Length: 100.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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/Mx9+/ZNmVe9BwCgIwzoAAAkUUlJif7nf/5HL7zwgo466qh9fv0nn3yiJ598Utdcc42uvPLKtsfffffd/VrH7i8st6/H9+bQQw/VZz7zGf35z3/Wbbfd1mMvwvb666/rnXfe0R/+8Ad973vfa3t82bJlXfo+XflZAACwgL9uBgAgif7P//k/6t+/v+bNm6f169fv8fnd73K33m3e/fFbb711v9YxYMAA1dfX7/VxSXv93N5cc8012rRpk84555x2L3LX6oknntBjjz3WpbXt7WeOx+O67bbbuvR9BgwYsNenAAAAYBV30AEASKLx48dr0aJFOuuss/SZz3xGM2fO1MSJExWPx7Vq1SotWrRI4XC47TnVgwYN0pQpU3TTTTcpGo3qgAMO0BNPPKFVq1bt1zqOPPJI/f3vf9fNN9+sgoICjRs3TkcffbSOPPJISdJPfvITzZgxQ5FIRKeeemrb4L676dOn6/XXX9f111+vl19+WWeddZbGjh2rTZs26fHHH9eTTz6pRYsWdWltEyZM0MEHH6wf/vCHWrt2rQYNGqT//d//7fJz6I888kgtXrxYCxcu1Be/+EVlZ2fr1FNP7dL3AAAgmRjQAQBIsm9+85t6/fXX9ctf/lJPPPGE7rnnHoVCIY0dO1YlJSU677zzNHHixLavX7RokS688ELdfvvtisfjmjp1qpYuXaqCgoJur+Hmm2/Wueeeq5/+9KfasWOHzj77bB199NH64he/qGuvvVZ33nmnHn/8ccViMa1atSrhgC5J1113nb761a/qV7/6le644w7V1dVp6NChOuaYY/TnP/9Z3/jGN7q0tkgkor/+9a+66KKLdMMNN6hfv3761re+pQULFrT7/7IvF1xwgV555RXde++9uuWWWzR27FgGdACAaaF4T79iDAAAAAAA6DKegw4AAAAAgAEM6AAAAAAAGMCADgAAAACAAQzoAAAAAAAYwIAOAAAAAIABDOgAAAAAABgQqPdBj8Viqqmp0cCBAxUKhfxeDgAAAAAgzcXjcW3ZskUFBQUKhzu+Rx6oAb2mpkajR4/2exkAAAAAgID56KOPNGrUqA6/JlAD+sCBAyV5/2MGDRrk82oSi0ajeuKJJzR16lRFIhG/lwPsFecprOMchXWco7COcxTWpco5unnzZo0ePbptHu1IoAb01l9rHzRokPkBvX///ho0aJDp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",
      "text/plain": [
       "<Figure size 1200x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "parameters = {\"instance\": {\"problem_instance\": \"custom_problem_instance\"},\n",
    "             \"solver\": {\"time_limit\": 3600, \"model\": \"fjsp_sdst\"},\n",
    "             \"output\": {\"logbook\": True}\n",
    "             }\n",
    "\n",
    "jobShopEnv = parse(processing_info)\n",
    "results, jobShopEnv = run_CP_SAT(jobShopEnv, **parameters)\n",
    "\n",
    "plt = plot_gantt_chart(jobShopEnv)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1ee9d14d-edcf-44ff-bc77-a933a31401f1",
   "metadata": {},
   "source": [
    "### Genetic Algorithm\n",
    "\n",
    "In the code below we configure the Genetic Algorithm (GA) to solve the defined problem. For this, we decide on the population size, number of search generations (ngen), crossover rate (cr), and mutation probability (input). We also specify 'multiprocessing' as true to allow for parallel evaluation of the different obtained solutions in the different generations of the search."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "18767b05",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:root:gen\tavg    \tstd          \tmin   \tmax   \n",
      "0  \t[142.8]\t[22.94689521]\t[116.]\t[188.]\n",
      "INFO:root:\n",
      "INFO:root:1  \t[129.] \t[12.9305839] \t[119.]\t[154.]\n",
      "INFO:root:2  \t[124.6]\t[13.24537655]\t[106.]\t[152.]\n",
      "INFO:root:3  \t[122.3]\t[7.40337761] \t[119.]\t[143.]\n",
      "INFO:root:4  \t[116.3]\t[5.15848815] \t[106.]\t[119.]\n",
      "INFO:root:5  \t[111.8]\t[5.72363521] \t[106.]\t[124.]\n",
      "INFO:root:6  \t[110.7]\t[4.1]        \t[106.]\t[118.]\n",
      "INFO:root:7  \t[108.8]\t[3.42928564] \t[106.]\t[113.]\n",
      "INFO:root:8  \t[104.2]\t[2.74954542] \t[100.]\t[106.]\n",
      "INFO:root:9  \t[109.7]\t[15.28430568]\t[100.]\t[155.]\n",
      "INFO:root:10 \t[113.3]\t[28.02873526]\t[100.]\t[197.]\n",
      "INFO:root:Makespan: 100\n"
     ]
    },
    {
     "data": {
      "image/png": "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/Mx9+/ZNmVe9BwCgIwzoAAAkUUlJif7nf/5HL7zwgo466qh9fv0nn3yiJ598Utdcc42uvPLKtsfffffd/VrH7i8st6/H9+bQQw/VZz7zGf35z3/Wbbfd1mMvwvb666/rnXfe0R/+8Ad973vfa3t82bJlXfo+XflZAACwgL9uBgAgif7P//k/6t+/v+bNm6f169fv8fnd73K33m3e/fFbb711v9YxYMAA1dfX7/VxSXv93N5cc8012rRpk84555x2L3LX6oknntBjjz3WpbXt7WeOx+O67bbbuvR9BgwYsNenAAAAYBV30AEASKLx48dr0aJFOuuss/SZz3xGM2fO1MSJExWPx7Vq1SotWrRI4XC47TnVgwYN0pQpU3TTTTcpGo3qgAMO0BNPPKFVq1bt1zqOPPJI/f3vf9fNN9+sgoICjRs3TkcffbSOPPJISdJPfvITzZgxQ5FIRKeeemrb4L676dOn6/XXX9f111+vl19+WWeddZbGjh2rTZs26fHHH9eTTz6pRYsWdWltEyZM0MEHH6wf/vCHWrt2rQYNGqT//d//7fJz6I888kgtXrxYCxcu1Be/+EVlZ2fr1FNP7dL3AAAgmRjQAQBIsm9+85t6/fXX9ctf/lJPPPGE7rnnHoVCIY0dO1YlJSU677zzNHHixLavX7RokS688ELdfvvtisfjmjp1qpYuXaqCgoJur+Hmm2/Wueeeq5/+9KfasWOHzj77bB199NH64he/qGuvvVZ33nmnHn/8ccViMa1atSrhgC5J1113nb761a/qV7/6le644w7V1dVp6NChOuaYY/TnP/9Z3/jGN7q0tkgkor/+9a+66KKLdMMNN6hfv3761re+pQULFrT7/7IvF1xwgV555RXde++9uuWWWzR27FgGdACAaaF4T79iDAAAAAAA6DKegw4AAAAAgAEM6AAAAAAAGMCADgAAAACAAQzoAAAAAAAYwIAOAAAAAIABDOgAAAAAABgQqPdBj8Viqqmp0cCBAxUKhfxeDgAAAAAgzcXjcW3ZskUFBQUKhzu+Rx6oAb2mpkajR4/2exkAAAAAgID56KOPNGrUqA6/JlAD+sCBAyV5/2MGDRrk82oSi0ajeuKJJzR16lRFIhG/lwPsFecprOMchXWco7COcxTWpco5unnzZo0ePbptHu1IoAb01l9rHzRokPkBvX///ho0aJDp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",
      "text/plain": [
       "<Figure size 1200x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "parameters = {\"instance\": {\"problem_instance\": \"custom_problem_instance\"},\n",
    "             \"algorithm\": {\"population_size\": 10, \"ngen\": 10, \"seed\": 5, \"cr\": 0.7, \"indpb\": 0.2, 'multiprocessing': True},\n",
    "             \"output\": {\"logbook\": True}\n",
    "             }\n",
    "\n",
    "jobShopEnv = parse(processing_info)\n",
    "population, toolbox, stats, hof = initialize_run(jobShopEnv, **parameters)\n",
    "makespan, jobShopEnv = run_GA(jobShopEnv, population, toolbox, stats, hof, **parameters)\n",
    "\n",
    "plt = plot_gantt_chart(jobShopEnv)\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
